<?php
namespace app\common\utils;

class Logger
{
    // 日志级别
    const DEBUG = 'DEBUG';
    const INFO = 'INFO';
    const WARN = 'WARN';
    const ERROR = 'ERROR';

    // 日志颜色
    const COLORS = [
        self::DEBUG => "\033[36m", // 青色
        self::INFO  => "\033[32m", // 绿色
        self::WARN  => "\033[33m", // 黄色
        self::ERROR => "\033[31m", // 红色
    ];

    // 日志存储路径
    protected static $logPath;
    
    // 是否开启终端打印
    protected static $enableConsole = true;

    /**
     * 初始化日志路径
     */
    public static function init()
    {
        self::$logPath = runtime_path() . 'logs' . DIRECTORY_SEPARATOR;
        if (!is_dir(self::$logPath)) {
            mkdir(self::$logPath, 0755, true);
        }
    }

    /**
     * 写入日志
     * @param string $message 日志信息
     * @param string $level 日志级别
     * @param array $context 上下文信息
     */
    protected static function write(string $message, string $level, array $context = [])
    {
        if (!self::$logPath) {
            self::init();
        }

        $time = date('Y-m-d H:i:s');
        $filename = date('Y-m-d') . '.log';
        
        // 格式化日志内容
        $content = sprintf(
            "[%s] [%s] %s %s\n",
            $time,
            $level,
            $message,
            !empty($context) ? json_encode($context, JSON_UNESCAPED_UNICODE) : ''
        );

        // 写入文件
        file_put_contents(
            self::$logPath . $filename,
            $content,
            FILE_APPEND | LOCK_EX
        );

        // 终端打印
        if (self::$enableConsole && php_sapi_name() === 'cli') {
            $color = self::COLORS[$level] ?? "\033[0m";
            echo $color . $content . "\033[0m";
        }
    }

    /**
     * 调试日志
     */
    public static function debug($message, array $context = [])
    {
        self::write($message, self::DEBUG, $context);
    }

    /**
     * 信息日志
     */
    public static function info($message, array $context = [])
    {
        self::write($message, self::INFO, $context);
    }

    /**
     * 警告日志
     */
    public static function warn($message, array $context = [])
    {
        self::write($message, self::WARN, $context);
    }

    /**
     * 错误日志
     */
    public static function error($message, array $context = [])
    {
        self::write($message, self::ERROR, $context);
    }

    /**
     * 设置是否启用控制台输出
     */
    public static function enableConsole(bool $enable = true)
    {
        self::$enableConsole = $enable;
    }

    /**
     * 获取日志完整路径
     */
    public static function getLogPath(): string
    {
        return self::$logPath;
    }
} 